package 二叉树练习题;

public class L如何对二叉树进行镜像反转 {


    /**
     * 二叉树的镜像就是二叉树对称的二叉树，
     * 就是交换每一个非叶子结点的左子树指针和右子树指针，
     * 如下图所示，请写出能实现该功能的代码。
     * 注意：请勿对该树做任何假设，它不一定是平衡树，也不一定有序
     * @param root
     */

    /**
     * 分析与解答
     * 从上图可以看出，要实现二叉树的镜像反转，
     * 只需交换二叉树中所有结点的左右孩子即可。
     * 由于对所有的结点都做了同样的操作，因此，可以用递归的方法来实现。
     * 由于需要调用printTreeLayer层序打印二叉树，
     * 这种方法中使用了队列来实现，实现代码如下
     *
     * @param root
     */
    public static void reverseTree(BiTNode root) {
        if (root == null) {
            return;
        }
        reverseTree(root.lchild);
        reverseTree(root.rchild);
        BiTNode tmp = root.lchild;
        root.lchild = root.rchild;
        root.rchild = tmp;
    }


    /**
     * 5
     * 3        7
     * 2    4   6    8
     * 1
     * <p>
     * 5
     * 7        3
     * 8    6   4     2
     * 1
     *
     * @param args
     */
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
        BiTNode root;
        root = B如何把一个有序的整数数组放到二叉树中.arraytotree(arr, 0, arr.length - 1);
        C如何从顶部开始逐层打印二叉树结点数据.printTreeLayer(root);
        System.out.println("反转前");
        reverseTree(root);
        System.out.println("反转后");
        C如何从顶部开始逐层打印二叉树结点数据.printTreeLayer(root);

    }
}
